// Package custctrl
// @Author: zhangdi
package custctrl

import (
	"path/filepath"
	"server/application/db/schema/sentity"
	"server/application/db/schema/tables"
	"server/application/db/system/dbsvc"
	"server/application/dto"
	"server/application/services/aiservice"
	"server/application/services/handlersvc"
	"server/pkg/ginp"
	"server/pkg/where"
	"server/setting"
)

func TripCreate(ctx *ginp.ContextPro) {
	var params *sentity.Trip
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//也可以自己创建并传入读写db: tables.NewTrip(wdb,rdb)
	info, err := tables.Trip.Create(params)
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}
	ctx.OkJsonData(info)
}

func TripUpdate(ctx *ginp.ContextPro) {
	var params *sentity.Trip
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	wheres := where.Format(where.OptEqual("id", params.ID))
	//也可以自己创建并传入读写db: tables.NewTrip(wdb,rdb)
	err := tables.Trip.Update(wheres, params)
	if err != nil {
		ctx.ErrJson("修改失败" + err.Error())
		return
	}
	ctx.OkJson()
}

func TripDelete(ctx *ginp.ContextPro) {
	var params *dto.CommonDelete
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}

	//也可以自己创建并传入读写db: tables.NewTrip(wdb,rdb)
	err := tables.Trip.Delete(where.FormatOne("id", "=", params.ID))
	if err != nil {
		ctx.ErrJson("删除失败" + err.Error())
		return
	}
	ctx.OkJson()
	return
}

func TripSearch(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误" + err.Error())
		return
	}
	//也可以自己创建并传入读写db: tables.NewTrip(wdb,rdb)
	list, total, err := tables.Trip.FindList(params.Wheres, params.Extra)
	if err != nil {
		ctx.ErrJson("查询失败" + err.Error())
		return
	}

	resp := &dto.RespSearch{
		List:     list,
		Total:    uint(total),
		PageNum:  uint(params.Extra.PageNum),
		PageSize: uint(params.Extra.PageSize),
	}
	ctx.OkJsonData(resp)

}

// TripImport 导入excel文件
func TripImport(ctx *ginp.ContextPro) {
	// 单个文件
	file, err := ctx.FormFile("file")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}

	// 保存文件
	filePath := "./uploads/import/" + file.Filename
	err = ctx.SaveUploadedFile(file, filePath)
	if err != nil {
		ctx.ErrJson(err.Error())
		return

	}
	isCover := true //冲突时覆盖
	isCoverStr := ctx.PostForm("isCover")
	if isCoverStr == "false" {
		isCover = false //冲突时覆盖
	}

	//也可以自己创建并传入读写db: tables.NewTrip(wdb,rdb)
	err = tables.Trip.ImportData(filePath, isCover)
	if err != nil {
		ctx.ErrJson("导入失败，请检excel格式是否正确：" + err.Error())
		return
	}
	//返回成功
	ctx.OkJson()
}

// TripImportTemplateFile 获取导入的模板文件
func TripImportTemplateFile(ctx *ginp.ContextPro) {

	filePath, err := dbsvc.SaveImportTemplateFile(sentity.Trip{}, " Trip")
	if err != nil {
		ctx.ErrJson(err.Error())
		return
	}
	ctx.FileAttachment(filePath, "template_Trip.xlsx")
}

// TripExport 导出数据
func TripExport(ctx *ginp.ContextPro) {
	var params *dto.ReqSearch
	if err := ctx.ShouldBindJSON(&params); err != nil {
		ctx.ErrJson("请求参数有误:" + err.Error())
		return
	}
	file_path, err := tables.Trip.ExportData(params)
	if err != nil {
		ctx.ErrJson("导出失败:" + err.Error())
		return
	}
	ctx.FileAttachment(file_path, filepath.Base(file_path))
}

func TripAiPlanningStream(ctx *ginp.ContextPro) {
	//从query获取参数prompt
	prompt := ctx.Query("prompt")
	if prompt == "" {
		ctx.ErrJson("prompt不能为空")
		return
	}
	//创建handler
	handler := handlersvc.NewHandlerCore()
	//调用ai服务
	tongyi := aiservice.NewTongyiService()
	//调用handler
	aiConfig := aiservice.TongyiConfig{
		ApiUrl:    setting.TongyiUrl,
		AccountId: 0,
		Prompt:    prompt,
	}
	tongyi.UseStreamToGinHandler(aiConfig, ctx, handler.Handler)
}
